701A 题意:给偶数张有点数的卡,问如何分配能使n/2个人拿到的点数一样
记录输入顺序,按点数排序,每次拿首尾两张
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
#include<iostream>
#include<string>
#define LL long long
using namespace std;
struct st
{
int bef;
int aft;
}card[105];
bool cmp(st a,st b)
{
return a.aft<b.aft;
}
int main()
{
//freopen("test.txt","r",stdin);
int n,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&card[i].aft);
card[i].bef=i;
}
sort(card+1,card+1+n,cmp);
for(int i=1;i<=n/2;i++) printf("%d %d\n",card[i].bef,card[n-i+1].bef);
return 0;
}
701B 题意:有n*n棋盘,输入m个车的坐标,对于每次新车的输入,计算不会被车攻击到的格数
每次有新的行/列被访问,则下一个访问能够影响到的行/列数相应减少
</pre><pre name="code" class="cpp">#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
#include<iostream>
#include<string>
#define LL long long
using namespace std;
const int N=1e6+5;
bool xv[N],yv[N];
LL ans[N];
int main()
{
//freopen("test.txt","r",stdin);
LL n,m;
int x,y,dx=0,dy=0;
scanf("%I64d%I64d",&n,&m);
for(int i=0;i<m;i++)
{
if(i==0) ans[i]=n*n;
else ans[i]=ans[i-1];
scanf("%d %d",&x,&y);
if(!xv[x])
{
ans[i]-=(n-dy);
xv[x]=1;
dx++;
}
if(!yv[y])
{
ans[i]-=(n-dx);
yv[y]=1;
dy++;
}
}
for(int i=0;i<m;i++)
{
printf("%I64d",ans[i]);
if(i!=m-1) printf(" ");
}
printf("\n");
return 0;
}