HEOI2015乱做
HJWJBSR
posted @ 2015年9月21日 21:31
in 题解
, 520 阅读
我已经不好意思把这个东西叫做题解了
这东西我记得之前CTSC的时候被XL叫去推HEOI,结果当时就smg都没搞出来,只弄出来Day1T3。感觉吧现在看起来还是很艹蛋
Day1T1兔子和樱花
不会做,还是看这里磨出来的代码。
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define N 2000050 int sg[N][2],c[N],n,m,st,s[N],ans; inline int Read() { int x=0;char y; do y=getchar(); while (y<'0'||y>'9'); do x=x*10+y-'0',y=getchar(); while (y>='0'&&y<='9'); return x; } inline bool cmp(int x,int y) {return s[x]<s[y];} void DFS(int x) { for (int i=sg[x][0];i<=sg[x][1];i++) DFS(c[i]); sort(c+sg[x][0],c+sg[x][1]+1,cmp); s[x]+=sg[x][1]-sg[x][0]+1; for (int i=sg[x][0];i<=sg[x][1];i++) if (s[x]+s[c[i]]-1<=m) s[x]+=s[c[i]]-1,ans++;else break; } int main() { n=Read();m=Read(); for (int i=1;i<=n;i++) s[i]=Read(); for (int i=1;i<=n;i++) { int k=Read();sg[i][0]=st+1; while (k--) c[++st]=Read()+1; sg[i][1]=st; } DFS(1); cout <<ans<<endl; return 0; }
Day1T3
当时的我都能做出来的煞笔题
#include <iostream> #include <string.h> #include <cmath> #include <cstdio> #include <algorithm> #define ll long long using namespace std; int n,m,t,v; ll mi; inline int ans(ll x) { int i=0; while (x%10==0) x/=10; if (x%10==5) i=-1; while (x) x/=10,i+=2; return i; } inline void Try(ll x) { if (x<n||x>m) return; int i=ans(x); if (v<=i||(v==i&&x>mi)) return; v=i;mi=x; return; } void aa(ll x,ll y) { ll i; if (x>m) return; if (x%y==0) aa(x,y*10);else { if ((x%y)/(y/10)<5) { i=x-x%y;i+=y/10*5;Try(i); }else { i=x-x%y;i+=y/10*5+y;Try(i); } i=x;i-=x%y;i+=y;Try(i); aa(i,y*10); } return; } int main() { int i,j,k,l,q,w,e; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); mi=n;v=ans(n); aa(n,10); printf("%lld\n",mi); } return 0; }
Day2T2
一眼Matrix-Tree(然而当时并不知道这种东西),当然也可以用插头DP(现在都不会这种狗哔东西)
需要注意的是模数是合数,妈蛋在这里被卡了。后来突然发现算行列式并不需要真的去除而是两行相消所以是辗转相除就行了。
我真是个煞笔。
#include <iostream> #include <cstring> #include <cmath> #include <cstdio> #include <algorithm> using namespace std; #define N 105 #define M 1000000000 #define ll long long ll t[N][N],ans=1;bool b[N][N];int sg[N][N],st,n,m;char c[N]; inline void Check(int x,int y,int z,int o) { if (!z||!o||b[z][o]) return; t[sg[x][y]][sg[z][o]]=t[sg[z][o]][sg[x][y]]=M-1; t[sg[x][y]][sg[x][y]]++;t[sg[z][o]][sg[z][o]]++; } inline ll abs(ll x) {return x<0?-x:x;} void Gauss() { for (int i=1;i<st;i++) { ll k=i,l; while (k<st&&!t[k][i]) k++; if (k==st) {ans=0;return;} if (k!=i) swap(t[k],t[i]),ans=-ans; for (int j=i+1;j<st;j++) if (t[j][i]) { k=t[i][i];l=t[j][i]; while (l) { ll e=k/l; for (int q=1;q<st;q++) t[i][q]=(t[i][q]-t[j][q]*e%M+M)%M; k%=l;swap(k,l);swap(t[i],t[j]);ans=-ans; } } } ans+=M; for (int i=1;i<st;i++) ans=ans*t[i][i]%M; return; } int main() { cin >>n>>m; for (int i=1;i<=n;i++) { scanf("%s",c); for (int j=0;j<m;j++) if (c[j]=='*') b[i][j+1]=1;else sg[i][j+1]=++st; } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (!b[i][j]) Check(i,j,i-1,j),Check(i,j,i,j-1); Gauss(); cout <<ans<<endl; return 0; }
剩下题目都在后面接着的那个BZOJ乱做里面放粗来了