September Challenge 2017

Little Chef and Sums

分析:水题,去维护一下前缀和以及后缀和就好,注意long long

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 using namespace std;
 6 const int maxn=1e5+10;
 7 const long long INF=1e10+10;
 8 long long a[maxn],dp[maxn];
 9 int n;
10 int main()
11 {
12     int T;
13     scanf("%d",&T);
14     while(T--){
15         memset(dp,0,sizeof(dp));
16         scanf("%d",&n);
17         long long sum=0;
18         for(int i=1;i<=n;i++){
19             scanf("%lld",&a[i]);
20              sum+=a[i];
21              dp[i]=dp[i-1]+a[i];
22         }
23         long long ans=INF;
24         int pos;
25         for(int i=1;i<=n;i++){
26             long long num=sum+dp[i];
27             if(num<ans){
28                 ans=num;
29                 pos=i;
30             }
31             sum-=a[i];
32         }
33         printf("%d\n",pos);
34     }
35     return 0;
36 }

Minimum Good Permutation

分析:水题,对于个数为偶数的交换任意两个就好,对于个数为奇数的,前面交换任意两个,后三个数做两次交换

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 using namespace std;
 6 const int maxn=1e5+10;
 7 int T,n,a[maxn];
 8 int main()
 9 {
10     int T;
11     cin>>T;
12     while(T--){
13         cin>>n;
14         for(int i=1;i<=n;i++)
15             a[i]=i;
16         if(n%2==0){
17             for(int i=1;i<=n;i+=2){
18                 swap(a[i],a[i+1]);
19             }
20             for(int i=1;i<n;i++){
21                 printf("%d ",a[i]);
22             }
23             printf("%d\n",a[n]);
24         }else{
25             if(n==1){
26                 printf("%d\n",a[n]);
27             }else{
28                 for(int i=1;i<=n-3;i+=2){
29                     swap(a[i],a[i+1]);
30                 }
31                 swap(a[n-2],a[n-1]);
32                 swap(a[n-1],a[n]);
33                 for(int i=1;i<n;i++){
34                 printf("%d ",a[i]);
35                 }
36                 printf("%d\n",a[n]);
37             }
38         }
39     }
40     return 0;
41 }

Chef and Pick Digit

分析:找出数列中出现过的数,然后暴力去构造A到Z就好了,注意有些数在数列中只出现过一次

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "set"
 6 using namespace std;
 7 const int maxn=1e5+100;
 8 const int maxm=200;
 9 int vis[maxn],f[maxm];
10 char s[maxn];
11 int T;
12 int main()
13 {
14     cin>>T;
15     getchar();
16     while(T--){
17         memset(s,0,sizeof(s));
18         memset(vis,0,sizeof(vis));
19         memset(f,0,sizeof(f));
20         int n=0;
21         char ch=getchar();
22         while(ch!=‘\n‘)  s[++n]=ch,ch=getchar();
23         for(int i=1;i<=n;i++){
24             int num=s[i]-‘0‘;
25             vis[num]++;
26         }
27         for(int i=0;i<=9;i++){
28             for(int j=0;j<=9;j++){
29                 if(vis[i]&&vis[j]){
30                     if(i==j&&vis[i]==1)  continue;
31                     int num=i*10+j;
32                     if(num>=‘A‘&&num<=‘Z‘){
33                         f[num]=1;
34                     }
35                 }
36             }
37         }
38         for(char i=‘A‘;i<=‘Z‘;i++)
39             if(f[i]){
40                 printf("%c",i);
41             }
42         printf("\n");
43     }
44     return 0;
45 }

Sereja and Commands

分析:非常好的一道题,感谢hzm教我怎么做,首先我们需要用线段树去维护每个操作出现的次数。这个地方首先我们倒着推,开始的时候我们初始化每个操作都执行1次,然后遇到2的时候,我们就把2所维护的区间[l,r]当中的每个数都加上当前这个操作执行的次数,这样我们可以求出每个1操作执行了多少次,最后在线段树区间修改就搞定了。

  1 #include "iostream"
  2 #include "cstdio"
  3 #include "cstring"
  4 #include "string"
  5 #include "vector"
  6 using namespace std;
  7 const int maxn=1e5+10;
  8 const int mod=1e9+7;
  9 int T,n,m;
 10 struct Node
 11 {
 12     int num,x,y;
 13 };
 14 Node p[maxn];
 15
 16
 17
 18 //typedef long long int;
 19 struct T
 20 {
 21     int l, r;
 22     int c;
 23 } tree[maxn<<2];
 24 int add[maxn<<2], mul[maxn<<2];
 25
 26 void pushdown(int k, int d,int p)
 27 {
 28     if(mul[k]==1&&add[k]==0)
 29         return ;
 30     tree[k<<1].c=tree[k<<1].c*mul[k]%p;
 31     tree[k<<1|1].c=tree[k<<1|1].c*mul[k]%p;
 32     tree[k<<1].c=(tree[k<<1].c+add[k]*(d-(d>>1)))%p;
 33     tree[k<<1|1].c=(tree[k<<1|1].c+add[k]*(d>>1))%p;
 34     mul[k<<1]=mul[k]*mul[k<<1]%p;
 35     mul[k<<1|1]=mul[k]*mul[k<<1|1]%p;
 36     add[k<<1]=(add[k<<1]*mul[k]+add[k])%p;
 37     add[k<<1|1]=(add[k]+add[k<<1|1]*mul[k])%p;
 38     add[k]=0;
 39     mul[k]=1;
 40     return ;
 41 }
 42 void pushup(int k,int p)
 43 {
 44     tree[k].c=(tree[k<<1].c+tree[k<<1|1].c)%p;
 45 }
 46 void build1(int l, int r, int k, int p)
 47 {
 48     tree[k].l=l;
 49     tree[k].r=r;
 50     tree[k].c=0;
 51     mul[k]=1;
 52     add[k]=0;
 53     if(l==r)
 54     {
 55         tree[k].c=1;
 56         return;
 57     }
 58     int mid=(tree[k].l+tree[k].r)>>1;
 59     build1(l, mid, k<<1, p);
 60     build1(mid+1,r,k<<1|1, p);
 61     pushup(k, p);
 62 }
 63 void build0(int l, int r, int k, int p)
 64 {
 65     tree[k].l=l;
 66     tree[k].r=r;
 67     tree[k].c=0;
 68     mul[k]=1;
 69     add[k]=0;
 70     if(l==r)
 71     {
 72         tree[k].c=0;
 73         return;
 74     }
 75     int mid=(tree[k].l+tree[k].r)>>1;
 76     build0(l, mid, k<<1, p);
 77     build0(mid+1,r,k<<1|1, p);
 78     pushup(k, p);
 79 }
 80 void update(int l, int r, int k, int c, int op, int p)
 81 {
 82     if(tree[k].l>=l&&tree[k].r<=r){
 83         if(op==1){
 84             add[k]=add[k]*c%p;
 85             mul[k]=mul[k]*c%p;
 86             tree[k].c=tree[k].c*c%p;
 87         }
 88         else{
 89             add[k]=(add[k]+c)%p;
 90             tree[k].c=(tree[k].c+(tree[k].r-tree[k].l+1)*c)%p;
 91         }
 92         return;
 93     }
 94     pushdown(k, tree[k].r-tree[k].l+1, p);
 95     int mid=(tree[k].l+tree[k].r)>>1;
 96     if(l<=mid)
 97         update(l,r,k<<1,c,op,p);
 98     if(r>mid)
 99         update(l,r,k<<1|1,c,op,p);
100     pushup(k,p);
101 }
102 int query(int l, int r, int k, int p)
103 {
104     if(tree[k].l>=l&&tree[k].r<=r)
105         return tree[k].c%p;
106     pushdown(k, tree[k].r-tree[k].l+1, p);
107     int ans=0;
108     int mid = (tree[k].l+tree[k].r)>>1;
109     if(l<=mid)
110         ans=(ans+query(l,r,k<<1,p))%p;
111     if(r>mid)
112         ans=(ans+query(l,r,k<<1|1, p))%p;
113     return ans%p;
114 }
115
116 vector<int> Q;
117 int dp[maxn];
118 int main()
119 {
120     cin>>T;
121     while(T--){
122         memset(dp,0,sizeof(dp));
123         scanf("%d%d",&n,&m);
124         int N=max(n,m);
125         Q.clear();
126         build1(1,N,1,mod);
127         for(int i=1;i<=m;i++){
128             scanf("%d%d%d",&p[i].num,&p[i].x,&p[i].y);
129             if(p[i].num==1){
130                 Q.push_back(i);
131             }
132         }
133         if(Q.size()==m){
134             build0(1,N,1,mod);
135             for(int i=1;i<=m;i++){
136                 update(p[i].x,p[i].y,1,1,2,mod);
137             }
138             for(int i=1;i<n;i++)
139                 printf("%d ",query(i,i,1,mod));
140             printf("%d\n",query(n,n,1,mod));
141             continue;
142         }
143         if(Q.size()==0){
144             for(int i=1;i<n;i++)
145                 printf("0 ");
146             printf("0\n");
147             continue;
148         }
149         for(int i=m;i>=1;i--){
150             if(p[i].num==1){
151                 continue;
152             }else{
153                 int res=query(i,i,1,mod);
154                 update(p[i].x,p[i].y,1,res,2,mod);
155             }
156         }
157         for(int i=0;i<Q.size();i++){
158             dp[Q[i]]=query(Q[i],Q[i],1,mod);
159             //printf("%d ",dp[Q[i]]);
160         }
161         //printf("\n");
162         build0(1,N,1,mod);
163         for(int i=0;i<Q.size();i++){
164             int tt=Q[i];
165             int num=dp[tt];
166             //cout<<tt<<endl;
167             //cout<<num<<endl;
168             update(p[tt].x,p[tt].y,1,num,2,mod);
169             //add1(p[tt].x,num);
170             //add1(p[tt].y+1,-num);
171         }
172         for(int i=1;i<n;i++)
173             printf("%d ",query(i,i,1,mod));
174         printf("%d\n",query(n,n,1,mod));
175     }
176     return 0;
177 }

时间: 2024-10-29 19:10:34

September Challenge 2017的相关文章

codechef September Challenge 2017 Fill The Matrix

这道题我们发现0就代表相同1代表少1或者大1 那么我们根据题目连边 如果存在1(边权只为或0)个数为奇数的环就是无解 #include<cstdio> #include<cstring> #include<algorithm> const int M=1e6+7; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c&

September 10th 2017 Week 37th Sunday

Dream most deep place, only then the smile is not tired. 梦的最深处,只有微笑不累. Everyday I expect I can go to sleep earlier and have a good dream. Because I always attempt to get some enlightments from dreams. And now I know that is nothing but wishful thinki

codechef September Challenge 2018 Division 2 A-F

比赛链接 上紫啦hhh,好开心 每个题里面都有中文翻译,我就不说题意了.. A 直接模拟即可 #include<cstdio> #include<algorithm> #define int long long using namespace std; const int MAXN = 1e5 + 10; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9')

hdu 6127 : Hard challenge (2017 多校第七场 1008)(计算几何)

题目链接 题意:二维平面上有n个点(没有重叠,都不在原点,任意两点连线不过原点),每个点有一个权值,用一条过原点的直线把他们划分成两部分,使两部分的权值和的乘积最大.输出最大的乘积. 极角排序后,将原来(-pi,pi]区间的元素copy到(pi,3pi],用双指针维护一个角度差不超过pi的区间,记区间的权值和为sum1,用sum1*(sum-sum)更新ans #include<bits/stdc++.h> using namespace std; typedef long long LL;

[codechef July Challenge 2017] IPC Trainers

IPCTRAIN: 训练营教练题目描述本次印度编程训练营(Indian Programming Camp,IPC)共请到了 N 名教练.训练营的日程安排有 M 天,每天最多上一节课.第 i 名教练在第 Di 天到达,直到训练营结束才离开.第 i 名教练希望上 Ti 节课.要是少上了课,那么教练会感到扎心,每少上一节,扎心值就会加 Si.作为主办方,你希望最小化所有教练的扎心值之和.输入格式输入的第一行包含一个整数 T,代表测试数据的组数.接下来是 T 组数据.每组数据的第一行包含两个整数 N 和

[codechef July Challenge 2017] Chef and Sign Sequences

CHEFSIGN: 大厨与符号序列题目描述大厨昨天捡到了一个奇怪的字符串 s,这是一个仅包含'<'.'='和'>'三种比较符号的字符串.记字符串长度为 N,大厨想要在字符串的开头.结尾,和每两个字符之间插入一个正整数,共N + 1 个数.大厨希望插入数字之后,这些比较符号所表达的含义是正确的.举个例子,如果在'<'前后分别插入 a 和 b,那么应当有 a < b.对于'='和'>'也是类似的.大厨可以在 [1, P] 中任意选择数字插入,同一个数也可以被插入到多个位置.请你帮

[codechef July Challenge 2017] Calculator

CALC: 计算器题目描述大厨有一个计算器,计算器上有两个屏幕和两个按钮.初始时每个屏幕上显示的都是 0.每按一次第一个按钮,就会让第一个屏幕上显示的数字加 1,同时消耗 1 单位的能量.每按一次第二个按钮,会让第二个屏幕上显示的数字加上第一个屏幕上显示的数字,同时消耗 B 单位的能量.初始时,计算器有 N 单位的能量.大厨想知道在能量限制下,第二个屏幕上最大可以出现的数字是多少?输入格式输入的第一行包含一个整数 T,代表测试数据的组数.接下来是 T 组数据.每组数据仅有一行,包含两个整数 N

May Challenge 2017

Chef and his daily routine 分析:水题,设置优先级,判断如果后面小于前面就输出no 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 const int maxn=10000+10; 7 string s; 8 int T; 9 int

CodeChef June Challenge 2017

好气啊,本来以为比赛时间还有很多,结果回家养病两天回到学校怎么比赛就结束了(雾),大约是小高考弄错了时间? 挑3道有意思的写写题解吧. Cloning 题目大意:给一个序列,每次询问两个等长区间,问区间内的数是否排序后至多只有一个对应位不同. 题解:主席树维护一下hash,求出最大的k,使得两个区间中的前k大在排序后相同,然后判一下后缀即可. #include<cstdio> #include<algorithm> #define MN 110000 #define ull uns