因为这场比赛是在寝室打的,所以写法都挺蠢的。。。不过也是我第一次过了cf5题时的三题,虽然感觉c题是我打的这几场里最简单的c题。
A:用的最蠢的办法
直接+,程序自己判断进位,然后判断回文。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
int check(int m,int n)
{
char s[10],v[10];
int num = 0;
s[num++] = m/10+'0', s[num++] = m%10 + '0';
s[num++] = n/10 +'0', s[num++] = n%10 + '0';
s[num] = '\0';
for(int i = 0; i < num; i++)
v[i] = s[num-i-1];
v[num] = '\0';
if(strcmp(s,v) == 0 )return 1;
else return 0;
}
int main()
{
int m,n;
scanf("%d:%d",&m,&n);
int temp = 0;
for(int i = 0; i < 2400*60; i++)
{
if(check(m,n))
{ temp = i; break;}
//else n++;
n++;
if(n == 60) m++, n = 0;
if(m == 24) m = 0;
}
printf("%d\n", temp);
return 0;
}
B: 我是用的线段树维护,只能保证不超时,实际上线段树还写搓了一次,tle了,后10分钟我把我的代码锁了去看别人的代码,发现别人的代码意外的简洁,之后会学习。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
const int maxn = 2e5+10;
int data[maxn][2];
int num[maxn << 2];
int tag[maxn << 2];
int v[maxn << 2];
int n,k,q;
void add(int al,int ar,int id,int l,int r)
{
if(ar < l || al > r) return;
if(l >= al && r <= ar )
{
tag[id] += 1;
num[id] += (r-l+1);
return;
}
int m = l+r>>1;
if(tag[id])
{
num[id << 1] += (m-l+1)*tag[id];
num[id << 1|1] += (r-m)*tag[id];
tag[id << 1] += tag[id];
tag[id << 1 | 1] += tag[id];
tag[id] = 0;
}
if(al <= m) add(al,ar, id<<1,l,m);
if(ar > m) add(al,ar,id<<1|1,m+1,r);
num[id] = num[id<<1] + num[id<<1|1];
}
int use(int id,int l,int r)
{
if(l == r)
{
if(num[id] >= k)
v[id] = 1;
else v[id] = 0;
return 1;
}
int m = l+r>>1;
if(tag[id])
{
num[id << 1] += (m-l+1)*tag[id];
num[id << 1|1] += (r-m)*tag[id];
tag[id << 1] += tag[id];
tag[id << 1 | 1] += tag[id];
tag[id] = 0;
}
use(id<<1,l,m);
use(id<<1|1,m+1,r);
v[id] = v[id<<1] + v[id<<1|1];
}
int qu(int ql,int qr,int id,int l,int r)
{
if(qr < l || ql > r) return 0;
if(l >= ql && r <= qr ) return v[id];
int m = l+r>>1;
int ans = 0;
if(ql <= m) ans += qu(ql,qr,id<<1,l,m);
if(qr > m) ans += qu(ql,qr,id<<1|1,m+1,r);
return ans;
}
int main()
{
scanf("%d%d%d",&n,&k,&q);
int r = maxn;
for(int i = 0; i < n ; i++)
{
int a,b;
scanf("%d%d",&a,&b);
add(a,b,1,1,r);
//r = max(r,b);
}
r = maxn;
//for(int i = 0; i < n; i++)
// add(data[i][0],data[i][1],1,1,r);
use(1,1,r);
for(int i = 0; i < q; i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",qu(a,b,1,1,r));
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
const int maxn = 105;
const int inf = 0x3f3f3f3f;
int g[maxn][maxn],h[maxn][maxn],g1[maxn][maxn];
int row[maxn][2],col[maxn][2];
int ansr[maxn][2], ansc[maxn][2];
int main()
{
//freopen("D://in.txt","r",stdin);
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d",&g[i][j]);
memcpy(g1,g,sizeof(g));
int ans1 = 0;
for(int i = 1; i <= n; i++)
{
int imin = inf;
for(int j = 1; j <= m; j++)
imin = min(imin, g[i][j]);
for(int j = 1; j <= m; j++)
g1[i][j] -= imin;
row[i][0] = imin;
ans1 += imin;
}
for(int j = 1; j <= m; j++)
{
int imin = inf;
for(int i = 1; i <= n; i++)
imin = min(imin, g1[i][j]);
col[j][0] = imin;
ans1 += imin;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
h[i][j] += row[i][0];
}
for(int j = 1 ; j <= m; j++)
for(int i = 1 ; i <= n; i++)
h[i][j] += col[j][0];
int mark = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(h[i][j] != g[i][j])
{mark = 1;break;}
}
if(mark) break;
}
int ans2 = 0,flag = 0;
memcpy(g1,g,sizeof(g));
memset(h,0,sizeof(h));
for(int j = 1; j <= m; j++)
{
int imin = inf;
for(int i = 1; i <= n; i++)
imin = min(imin, g[i][j]);
for(int i = 1; i <= n; i++)
g1[i][j] -= imin;
col[j][1] = imin;
ans2 += imin;
}
for(int i = 1; i <= n; i++)
{
int imin = inf;
for(int j = 1; j <= m; j++)
imin = min(imin, g1[i][j]);
row[i][1] = imin;
ans2 += imin;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
h[i][j] += row[i][1];
}
for(int j = 1 ; j <= m; j++)
for(int i = 1 ; i <= n; i++)
h[i][j] += col[j][1];
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(h[i][j] != g[i][j])
{flag = 1;break;}
}
if(flag) break;
}
if(mark && flag) printf("-1\n");
else if(!mark && flag)
{
cout<<ans1<<endl;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j < row[i][0]; j++)
cout<<"row "<<i<<endl;
}
for(int j = 1; j <= m; j++)
for(int i = 0; i < col[j][0]; i++ )
cout<<"col "<<j<<endl;
}
else if(mark && !flag)
{
cout<<ans2<<endl;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j < row[i][1]; j++)
cout<<"row "<<i<<endl;
}
for(int j = 1; j <= m; j++)
for(int i = 0; i < col[j][1]; i++ )
cout<<"col "<<j<<endl;
}
else
{
int id = ans1 > ans2 ? 1 : 0;
cout<<min(ans1,ans2)<<endl;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j < row[i][id]; j++)
cout<<"row "<<i<<endl;
}
for(int j = 1; j <= m; j++)
for(int i = 0; i < col[j][id]; i++ )
cout<<"col "<<j<<endl;
}
return 0;
}