Codeforces Round #460 (Div. 2)
最后把记忆化搜索乱搞的点给写串了,又炸裂了
但是因为馒神操作了一番 避免了掉rating
T1 T2 T3 sb题,随便搞一搞50分钟过
1 // T1: 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<algorithm> 8 #include<queue> 9 #include<vector> 10 #include<map> 11 #define inf 2139062143 12 #define ll long long 13 #define MAXN 14 #define MOD 15 using namespace std; 16 inline int read() 17 { 18 int x=0,f=1;char ch=getchar(); 19 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 20 while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); 21 return x*f; 22 } 23 int n,m; 24 double a,b,t; 25 int main() 26 { 27 n=read(),m=read(),t=1000.0; 28 for(int i=1;i<=n;i++) {scanf("%lf%lf",&a,&b);t=min(t,a/b);} 29 printf("%.8lf",t*m); 30 } 31 // T2: 32 #include<iostream> 33 #include<cstdio> 34 #include<cstring> 35 #include<cstdlib> 36 #include<cmath> 37 #include<algorithm> 38 #include<queue> 39 #include<vector> 40 #include<map> 41 #define inf 2139062143 42 #define ll long long 43 #define MAXN 44 #define MOD 45 using namespace std; 46 inline int read() 47 { 48 int x=0,f=1;char ch=getchar(); 49 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 50 while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); 51 return x*f; 52 } 53 int k; 54 int check(int x) 55 { 56 int res=0; 57 while(x) res+=x%10,x/=10; 58 return res==10; 59 } 60 int main() 61 { 62 k=read(); 63 int i=19; 64 while(k) 65 { 66 if(check(i)) k--; 67 i++; 68 } 69 printf("%d",i-1); 70 } 71 // T3: 72 #include<iostream> 73 #include<cstdio> 74 #include<cstring> 75 #include<cstdlib> 76 #include<cmath> 77 #include<algorithm> 78 #include<queue> 79 #include<vector> 80 #include<map> 81 #define inf 2139062143 82 #define ll long long 83 #define MAXN 84 #define MOD 85 using namespace std; 86 inline int read() 87 { 88 int x=0,f=1;char ch=getchar(); 89 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 90 while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); 91 return x*f; 92 } 93 int n,m,k,ans,tmp; 94 char mp[2010][2010]; 95 int main() 96 { 97 n=read(),m=read(),k=read(); 98 for(int i=0;i<n;i++) scanf("%s",mp[i]); 99 for(int i=0;i<n;i++) 100 { 101 int j=0; 102 while(j<m) 103 { 104 tmp=j; 105 while(mp[i][j]=='.'&&j<m) j++; 106 ans+=max(0,j-tmp-k+1); 107 while(mp[i][j]!='.'&&j<m) j++; 108 } 109 } 110 for(int j=0;j<m;j++) 111 { 112 int i=0; 113 while(i<n) 114 { 115 tmp=i; 116 while(mp[i][j]=='.'&&i<n) i++; 117 ans+=max(0,i-tmp-k+1); 118 while(mp[i][j]!='.'&&i<n) i++; 119 } 120 } 121 if(k==1) ans/=2; 122 printf("%d",ans); 123 }
T4:
一个有向图 点上有字母
在图上找一条路径 使路径上经过的点上出现次数最多字母的出现次数最大
思路:
设一个dp数组 dp i j 表示第i个点 j字母的个数
然后边拓扑边转移
就搞出来了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #define inf 2139062143 11 #define ll long long 12 #define MAXN 301010 13 using namespace std; 14 inline int read() 15 { 16 int x=0,f=1;char ch=getchar(); 17 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 18 while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); 19 return x*f; 20 } 21 int n,fst[MAXN],nxt[MAXN<<1],to[MAXN<<1],cnt,m,val[MAXN],f[MAXN][30],ind[MAXN],ans,tot; 22 void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,ind[v]++;} 23 int main() 24 { 25 n=read(),m=read();int a,b; 26 char ch[MAXN]; 27 scanf("%s",ch); 28 for(int i=0;i<n;i++) val[i+1]=ch[i]-'a'+1; 29 for(int i=1;i<=m;i++) {a=read(),b=read();add(a,b);if(a==b) {puts("-1");return 0;}} 30 queue <int> q; 31 for(int i=1;i<=n;i++) {f[i][val[i]]=1;if(!ind[i]) q.push(i);} 32 int x; 33 while(!q.empty()) 34 { 35 x=q.front();q.pop(); 36 tot++; 37 for(int i=fst[x];i;i=nxt[i]) 38 { 39 ind[to[i]]--; 40 if(!ind[to[i]]) q.push(to[i]); 41 for(int j=1;j<=26;j++) 42 { 43 if(f[to[i]][j]<f[x][j]&&j!=val[to[i]]) f[to[i]][j]=f[x][j],ans=max(ans,f[to[i]][j]); 44 if(f[to[i]][j]<f[x][j]+1&&j==val[to[i]]) f[to[i]][j]=f[x][j]+1,ans=max(ans,f[to[i]][j]); 45 } 46 } 47 } 48 if(tot!=n) {puts("-1");return 0;} 49 printf("%d",ans); 50 }
T5:
求一个正整数n<=x 使
思路:
通过题解的打表
然后可以枚举j 可以知道 b·a^(-j) 和 j-i 对p同余
然后就求一下逆元搞一下 求一下i 就行了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #define inf 2139062143 11 #define ll long long 12 #define MAXN 1001001 13 using namespace std; 14 inline ll read() 15 { 16 ll x=0,f=1;char ch=getchar(); 17 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 18 while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); 19 return x*f; 20 } 21 ll inv[MAXN],a,b,p,x,tmp=1,ans; 22 int main() 23 { 24 a=read(),b=read(),p=read(),x=read(),inv[1]=1; 25 for(ll i=2;i<p;i++) inv[i]=(p-p/i)*inv[p%i]%p; 26 for(ll i=0;i<p-1;i++,(tmp*=a)%=p) 27 ans+=(x-((i+p-b*inv[tmp]%p)%p*(p-1)+i)+p*(p-1))/p/(p-1); 28 printf("%I64d",ans); 29 }