【纪中受难记】——C3D5:破题
最后一题不改了,心态炸
3846. 七天使的通讯(angelus) (Standard IO)
Time Limits: 2000 ms Memory Limits: 262144 KB Detailed Limits
Goto ProblemSet这道题就是m^2判断相交线段,然后给图染色即可。
很水。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int read(){ 4 int x=0,f=1; 5 char c=getchar(); 6 while(!isdigit(c)){ 7 if(c=='-') f=-1; 8 c=getchar(); 9 } 10 while(isdigit(c)){ 11 x=(x<<1)+(x<<3)+(c^48); 12 c=getchar(); 13 } 14 return x*f; 15 } 16 int T,n,m; 17 const int N=1010; 18 struct node{ 19 int l,r; 20 }h[N]; 21 int vis[N]; 22 int flag; 23 struct edge{ 24 int to,nxt; 25 }e[N<<1]; 26 int head[N<<1],cnt; 27 void addedge(int from,int to){ 28 e[++cnt]=(edge){to,head[from]}; 29 head[from]=cnt; 30 } 31 void dfs(int u,int col){ 32 if(flag) return; 33 if(vis[u]){ 34 if(vis[u]!=col) flag=1; 35 return; 36 } 37 else vis[u]=col; 38 for(int i=head[u];i;i=e[i].nxt){ 39 int v=e[i].to; 40 dfs(v,col^1); 41 if(flag) return; 42 } 43 } 44 int main(){ 45 T=read(); 46 while(T--){ 47 // t.clear(); 48 memset(vis,0,sizeof(vis)); 49 memset(head,0,sizeof(head)); 50 cnt=0; 51 n=read();m=read(); 52 for(int i=1;i<=m;i++){ 53 h[i].l=read(); 54 h[i].r=read(); 55 if(h[i].l>h[i].r) swap(h[i].l,h[i].r); 56 } 57 for(int i=1;i<=m;i++){ 58 for(int j=1;j<i;j++){ 59 if((h[i].l<h[j].l&&h[i].r<h[j].r&&h[i].r>h[j].l)||(h[i].l>h[j].l&&h[i].r>h[j].r&&h[i].l<h[j].r)){ 60 addedge(i,j); 61 addedge(j,i); 62 } 63 } 64 } 65 flag=0; 66 for(int i=1;i<=m;i++){ 67 if(flag) break; 68 if(!vis[i]) dfs(i,2); 69 } 70 if(flag){ 71 printf("non\n"); 72 } 73 else printf("sane\n"); 74 } 75 return 0; 76 }
3847. 都市环游(travel) (Standard IO)
Time Limits: 1000 ms Memory Limits: 524288 KB Detailed Limits
Goto ProblemSet
这道题很有趣,发现hi<=70,先暴力打出前70时间的答案,然后多余的时间矩阵快速幂搞定。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int read(){ 4 int x=0,f=1; 5 char c=getchar(); 6 while(!isdigit(c)){ 7 if(c=='-') f=-1; 8 c=getchar(); 9 } 10 while(isdigit(c)){ 11 x=(x<<1)+(x<<3)+(c^48); 12 c=getchar(); 13 } 14 return x*f; 15 } 16 const int mod=10086; 17 typedef long long ll; 18 const int N=100; 19 int n,m,t; 20 int level[N]; 21 struct matrix{ 22 ll a[N][N]; 23 void Empty(){ 24 memset(a,0,sizeof(a)); 25 } 26 void One(){ 27 Empty(); 28 for(int i=1;i<=n;i++) a[i][i]=1; 29 } 30 void reset(){ 31 Empty(); 32 } 33 matrix operator*(matrix b){ 34 matrix tmp; 35 tmp.Empty(); 36 for(int r=1;r<=n;r++){ 37 for(int j=1;j<=n;j++){ 38 for(int k=1;k<=n;k++){ 39 (tmp.a[r][j]+=a[r][k]*b.a[k][j]%mod)%=mod; 40 } 41 } 42 } 43 return tmp; 44 } 45 }res,ans; 46 void pow(ll p){ 47 while(p){ 48 if(p&1){ 49 ans=ans*res; 50 } 51 res=res*res; 52 p>>=1; 53 } 54 } 55 struct node{ 56 int l,r; 57 int maxlevel; 58 bool operator < (const node &x)const{ 59 return maxlevel<x.maxlevel; 60 } 61 }h[5010]; 62 int cnt; 63 int vis[N][N]; 64 ll f[N][N]; 65 int main(){ 66 n=read();m=read();t=read(); 67 for(int i=1;i<=n;i++){ 68 level[i]=read(); 69 } 70 for(int i=1;i<=m;i++){ 71 int x=read(),y=read(); 72 if(!vis[x][y]) h[++cnt]=(node){x,y}; 73 vis[x][y]++; 74 } 75 f[0][1]=1; 76 for(int i=1;i<=70;i++){ 77 for(int j=1;j<=n;j++) f[i][j]=f[i-1][j]; 78 for(int j=1;j<=cnt;j++){ 79 if(i>=level[h[j].r]) f[i][h[j].r]=(f[i][h[j].r]+f[i-1][h[j].l]*vis[h[j].l][h[j].r])%mod; 80 } 81 } 82 if(t<=70){ 83 printf("%lld",f[t][n]); 84 return 0; 85 } 86 res.One(); 87 for(int i=1;i<=n;i++){ 88 ans.a[1][i]=f[70][i]; 89 } 90 for(int i=1;i<=cnt;i++){ 91 res.a[h[i].l][h[i].r]=vis[h[i].l][h[i].r]; 92 } 93 pow(t-70); 94 printf("%lld",ans.a[1][n]); 95 return 0; 96 }
3850. Fibonacci进制(fib) (Standard IO)
Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits
Goto ProblemSet
没改,直接上题解吧。
大意就是各种细节的计数。
我*……%&¥%……%&%#
——抓住了时间,却不会利用的人,终究也逃不过失败的命运。