问题 F: 豆子游戏
时间限制: 1 Sec 内存限制: 128 MB题目描述
PIPA拿来一个棋盘和许多豆子,她想要和KACA玩一个豆子游戏。
首先,她在棋盘的每一格中放入豆子,数量为该格的行号与列号的和(行与列从1开始)。
然后她让KACA取出某一行或者某一列的全部豆子,并要求回答此次取出了多少豆子。重复这一过程直到KACA不想提问了。
很显然的,当某一行或者某一列的豆子被拿走,那么这一行或者这一列的棋盘就空了。
输入
多组测试数据。
第一行为两个整数,n,q(1 ≤ n ≤ 10^6,1 ≤ q ≤ 10^5),分别代表棋盘有n行n列,共有q次提问。
下面q行有两种形式:
R k代表取出第k行,并输出该行的豆子总数。
C k代表取出第k列,并输出该列的豆子总数。
输出
对于每次询问,输出结果。
样例输入
3 2
R 1
C 1
样例输出
9
7
思路:小心超时,严格的模拟,好好宅规律;
注意清0过后不再减了;不要循环,用公式;
#include<stdio.h>
#include<math.h>
#include<string.h>
typedef long long ll;
ll b[1000010],c[1000010];
int main()
{
ll n,q,i,j,k,p1=0,p2=0,ans,n1,n2;
char ch;
while(scanf("%lld %lld",&n,&q)!=EOF)
{
ans=0;p1=0;p2=0;
n1=n;n2=n;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(i=1;i<=n;i++)
{
b[i]=(n*(n+1)/2)+n*i;
c[i]=b[i];
}
while(q--)
{
getchar();
scanf("%c %lld",&ch,&k);
if(ch=='R')
{
if(b[k])
{
printf("%lld\n",b[k]-p2-(n-n2)*k);
}
else printf("0\n");
if(b[k])
{
p1+=k;
n1--;
}
b[k]=0;
}
else if(ch=='C')
{
if(c[k])
{
printf("%lld\n",c[k]-p1-(n-n1)*k);
}
else printf("0\n");
if(c[k])
{
p2+=k;
n2--;
}
c[k]=0;
}
}
}
return 0;
}