题目:链接
A. An Olympian Math Problem
输出n-1即可(女朋友猜的)。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll fac[103];
int main()
{
ll n,T;cin>>T;
while(T--)
{
cin>>n;
cout<<n-1<<endl;
}
return 0;
}
B. The writing on the wall
枚举矩形的右下角,设为(x,y),若以(x,y)为右下角,设y这一行小于x且离x最近的一个空地坐标为L,
则以(x,y)为右下角可以形成宽度为1的矩形(x-L)个,以(x,y)为右下角可以形成宽度为2的矩形数量为
y行与y-1行的x-L取个min。遍历一遍宽度即可。虽说理论上是10亿的复杂度,可能判题机跑的比较快吧。
也可能数据较水。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
vector<int>G[maxn];
int n,m,k;
int L[maxn],iter[maxn],len[maxn];
int main()
{
int T,cas=0;scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<=n;i++) G[i].clear();
while(k--)
{
int x,y;scanf("%d%d",&x,&y);
G[y].push_back(x);
}
for(int i=1;i<=m;i++)
{
len[i]=G[i].size();
sort(G[i].begin(),G[i].end());
iter[i]=0;L[i]=0;
}
ll ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(iter[j]<len[j]&&G[j][iter[j]]==i)
{
L[j]=i;iter[j]++;
}
}
for(int j=1;j<=m;j++)
{
int mi=2e9;
for(int k=j;k>=1;k--)
{
mi=min(mi,i-L[k]