Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)
2017-07-14 02:54
381 查看
A 检测一个序列是否为单峰
http://codeforces.com/contest/831/problem/A
按递增相等递减的顺序遍历再检查是否遍历到末尾
B 对每个字母有一个映射求一个字符串映射后的结果
http://codeforces.com/contest/831/problem/B
用map同时建立大小写字母的映射
C
有k个变化 和 n个变化后的结果
求可能的初始值有多少种
http://codeforces.com/contest/831/problem/C
对每个bi都至少有一个合法位置 并且利用前缀和bi的位置和值可以计算出初始值
枚举一个bi是对应的ai变化的结果 再检测是否合法
D
有n个人 k个钥匙的位置 办公室的位置p
求所有人都能拿到1个钥匙并到达办公室的最小时间
http://codeforces.com/contest/831/problem/D
对人和钥匙的位置排序
二分答案并检测是否合法
从左往右开始贪心
每个人选择尽量左边的钥匙 保证右边的人尽量能选到x范围内的1把
http://codeforces.com/contest/831/problem/A
按递增相等递减的顺序遍历再检查是否遍历到末尾
#include <iostream> #include <algorithm> #include <sstream> #include <string> #include <queue> #include <cstdio> #include <map> #include <set> #include <utility> #include <stack> #include <cstring> #include <cmath> #include <vector> using namespace std; #define pb push_back #define scand(n) scanf("%d",&n) #define scandd(n,m) scanf("%d%d",&n,&m) #define scanddd(n,m,k) scanf("%d%d%d",&n,&m,&k) #define scanlld(n) scanf("%lld",&n) #define scanlldd(n,m) scanf("%lld%lld",&n,&m) #define scanllddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k) #define scanlf(n) scanf("%lf",&n) #define scanlff(n,m) scanf("%lf%lf",&n,&m) #define scanlfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k) #define scans(str) scanf("%s",str) #define ans() printf("%d",ans) #define ansn() printf("%d\n",ans) #define anss() printf("%d ",ans) #define llans() printf("%lld",ans) #define llanss() printf("%lld ",ans) #define llansn() printf("%lld\n",ans) #define REP(i,n) for(int i=0;i<(n);++i) #define REA(i,qwe,ewr) for(int i=qwe;i<=ewr;++i) #define RER(i,qwe,ewr) for(int i=qwe;i>=ewr;--i) #define R1(i,e) for(int i=1;i<=e;++i) #define RN(i,e) for(int i=e;i>=1;--i) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define all(a) a.begin(),a.end() #define pii pair<int,int> #define mp make_pair typedef long long ll; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } inline int mul_mod(int a, int b, int mo) { int ret; __asm__ __volatile__ ("\tmull %%ebx\n\tdivl %%ecx\n" : "=d"(ret):"a"(a),"b"(b),"c"(mo)); return ret; } const int mod = 1000000007; const double eps=1e-9; const int INF=0x3f3f3f3f; const int MAXN=2000+10; int num[MAXN]; int main() { #ifdef LOCAL freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // LOCAL int n; scand(n); R1(i,n)scand(num[i]); int cnt=0; bool u=1; int i; for(i=2;i<=n;++i) { if(num[i]<=num[i-1])break; } while(num[i]==num[i-1])i++; while(i<=n&&num[i]<num[i-1])i++; if(i==n+1)puts("YES"); else puts("NO"); return 0; }
B 对每个字母有一个映射求一个字符串映射后的结果
http://codeforces.com/contest/831/problem/B
用map同时建立大小写字母的映射
#include <iostream> #include <algorithm> #include <sstream> #include <string> #include <queue> #include <cstdio> #include <map> #include <set> #include <utility> #include <stack> #include <cstring> #include <cmath> #include <vector> using namespace std; #define pb push_back #define scand(n) scanf("%d",&n) #define scandd(n,m) scanf("%d%d",&n,&m) #define scanddd(n,m,k) scanf("%d%d%d",&n,&m,&k) #define scanlld(n) scanf("%lld",&n) #define scanlldd(n,m) scanf("%lld%lld",&n,&m) #define scanllddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k) #define scanlf(n) scanf("%lf",&n) #define scanlff(n,m) scanf("%lf%lf",&n,&m) #define scanlfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k) #define scans(str) scanf("%s",str) #define ans() printf("%d",ans) #define ansn() printf("%d\n",ans) #define anss() printf("%d ",ans) #define llans() printf("%lld",ans) #define llanss() printf("%lld ",ans) #define llansn() printf("%lld\n",ans) #define REP(i,n) for(int i=0;i<(n);++i) #define REA(i,qwe,ewr) for(int i=qwe;i<=ewr;++i) #define RER(i,qwe,ewr) for(int i=qwe;i>=ewr;--i) #define R1(i,e) for(int i=1;i<=e;++i) #define RN(i,e) for(int i=e;i>=1;--i) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define all(a) a.begin(),a.end() #define pii pair<int,int> #define mp make_pair typedef long long ll; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } inline int mul_mod(int a, int b, int mo) { int ret; __asm__ __volatile__ ("\tmull %%ebx\n\tdivl %%ecx\n" : "=d"(ret):"a"(a),"b"(b),"c"(mo)); return ret; } const int mod = 1000000007; const double eps=1e-9; const int INF=0x3f3f3f3f; const int MAXN=2000+10; int n,k; char s[MAXN],s2[MAXN],s3[MAXN]; map<char,char>ma; int main() { #ifdef LOCAL freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // LOCAL // scandd(n,k); scans(s+1); scans(s2+1); int n=strlen(s+1); R1(i,n) { if(!ma.count(s[i])) { ma[ s[i] ] = s2[i]; ma[ s[i]-32 ] = s2[i]-32; } } scans(s3+1); int m =strlen(s3+1); R1(i,m) { if(s3[i]>='0'&&s3[i]<='9') { putchar(s3[i]);continue; } char ch = ma[ s3[i] ]; putchar(ch); } return 0; }
C
有k个变化 和 n个变化后的结果
求可能的初始值有多少种
http://codeforces.com/contest/831/problem/C
对每个bi都至少有一个合法位置 并且利用前缀和bi的位置和值可以计算出初始值
枚举一个bi是对应的ai变化的结果 再检测是否合法
#include <iostream> #include <algorithm> #include <sstream> #include <string> #include <queue> #include <cstdio> #include <map> #include <set> #include <utility> #include <stack> #include <cstring> #include <cmath> #include <vector> using namespace std; #define pb push_back #define scand(n) scanf("%d",&n) #define scandd(n,m) scanf("%d%d",&n,&m) #define scanddd(n,m,k) scanf("%d%d%d",&n,&m,&k) #define scanlld(n) scanf("%lld",&n) #define scanlldd(n,m) scanf("%lld%lld",&n,&m) #define scanllddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k) #define scanlf(n) scanf("%lf",&n) #define scanlff(n,m) scanf("%lf%lf",&n,&m) #define scanlfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k) #define scans(str) scanf("%s",str) #define ans() printf("%d",ans) #define ansn() printf("%d\n",ans) #define anss() printf("%d ",ans) #define llans() printf("%lld",ans) #define llanss() printf("%lld ",ans) #define llansn() printf("%lld\n",ans) #define REP(i,n) for(int i=0;i<(n);++i) #define REA(i,qwe,ewr) for(int i=qwe;i<=ewr;++i) #define RER(i,qwe,ewr) for(int i=qwe;i>=ewr;--i) #define R1(i,e) for(int i=1;i<=e;++i) #define RN(i,e) for(int i=e;i>=1;--i) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define all(a) a.begin(),a.end() #define pii pair<int,int> #define mp make_pair typedef long long ll; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } inline int mul_mod(int a, int b, int mo) { int ret; __asm__ __volatile__ ("\tmull %%ebx\n\tdivl %%ecx\n" : "=d"(ret):"a"(a),"b"(b),"c"(mo)); return ret; } const int mod = 1000000007; const double eps=1e-9; const int INF=0x3f3f3f3f; const int MAXN=2000+10; int a[MAXN]; int b[MAXN]; int pri[MAXN]; map<int,int>ma,ma2; map<int,int>ma3; int main() { #ifdef LOCAL freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // LOCAL ll ans =0; int n,k; scandd(k,n); R1(i,k) { scand(a[i]); pri[i]= pri[i-1]+a[i]; } R1(i,n) { scand(b[i]); ma2[b[i] ]=1; } R1(i,k) { int cnt = n-1; ma3.clear(); for(int j=1;cnt&&j<=k;++j) { if(j==i)continue; int check = b[1] + (pri[j]-pri[i]); if(!ma2.count(check)||check==b[1])continue; if(!ma3.count(check)) --cnt,ma3[check]=1; } if(!cnt&&!ma.count(b[1]-pri[i])) ++ans,ma[b[1]-pri[i]]=1; } llans(); return 0; }
D
有n个人 k个钥匙的位置 办公室的位置p
求所有人都能拿到1个钥匙并到达办公室的最小时间
http://codeforces.com/contest/831/problem/D
对人和钥匙的位置排序
二分答案并检测是否合法
从左往右开始贪心
每个人选择尽量左边的钥匙 保证右边的人尽量能选到x范围内的1把
#include <iostream> #include <algorithm> #include <sstream> #include <string> #include <queue> #include <cstdio> #include <map> #include <set> #include <utility> #include <stack> #include <cstring> #include <cmath> #include <vector> using namespace std; #define pb push_back #define scand(n) scanf("%d",&n) #define scandd(n,m) scanf("%d%d",&n,&m) #define scanddd(n,m,k) scanf("%d%d%d",&n,&m,&k) #define scanlld(n) scanf("%lld",&n) #define scanlldd(n,m) scanf("%lld%lld",&n,&m) #define scanllddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k) #define scanlf(n) scanf("%lf",&n) #define scanlff(n,m) scanf("%lf%lf",&n,&m) #define scanlfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k) #define scans(str) scanf("%s",str) #define ans() printf("%d",ans) #define ansn() printf("%d\n",ans) #define anss() printf("%d ",ans) #define llans() printf("%lld",ans) #define llanss() printf("%lld ",ans) #define llansn() printf("%lld\n",ans) #define REP(i,n) for(int i=0;i<(n);++i) #define REA(i,qwe,ewr) for(int i=qwe;i<=ewr;++i) #define RER(i,qwe,ewr) for(int i=qwe;i>=ewr;--i) #define R1(i,e) for(int i=1;i<=e;++i) #define RN(i,e) for(int i=e;i>=1;--i) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define all(a) a.begin(),a.end() #define pii pair<int,int> #define mp make_pair typedef long long ll; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } inline int mul_mod(int a, int b, int mo) { int ret; __asm__ __volatile__ ("\tmull %%ebx\n\tdivl %%ecx\n" : "=d"(ret):"a"(a),"b"(b),"c"(mo)); return ret; } const int mod = 1000000007; const double eps=1e-9; const int INF=0x3f3f3f3f; const int MAXN=2000+10; ll a[MAXN],b[MAXN]; int num[MAXN];ll n,k,p; ll sum (int i,int j) { return abs(a[i]-b[j])+abs(b[j]-p); } bool check(ll x) { for(int i=1,j=1;i<=n;++i) { while(j<=k&&sum(i,j)>x)j++; if(j>k)return 0;++j; } return 1; } int main() { #ifdef LOCAL freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // LOCAL scanllddd(n,k,p); R1(i,n)scanlld(a[i]); R1(i,k)scanlld(b[i]); sort(a+1,a+1+n); sort(b+1,b+1+k); ll ans = 2000000000; ll l = 0 , r = 2000000000; while(l<=r) { ll mid = (l+r)>>1; if(check(mid)) { r=mid-1; ans = min(ans,mid); } else l=mid+1; } llans(); return 0; }
相关文章推荐
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)C. Jury Marks
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem E (Codeforces 831E) - 线段树 - 树状数组
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) D. Office Keys time limit per test2 seconds 二分
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Cards Sorting(树状数组)
- Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals)
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)-831C Jury Marks(思维)
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) 简单暴力
- Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) C. Bamboo Partition(数学)
- Codeforces Round #424 (Div. 1, rated, based on VK Cup Finals) D. Singer House(dp)
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) D
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem A - B
- Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) D. Best Edge Weight(最小生成树+LCA+树链剖分)
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组
- 【贪心】Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) A. String Reconstruction
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem C (Codeforces 828C) - 链表 - 并查集
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 分组+树状数组
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)C. Jury Marks
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) ..C. Jury Marks
- 【构造】Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) B. High Load