Codeforces Round #137 (Div. 2)
掉ranking了,这次cf水成这样,才搞出了两个题,还都不是1Y,彻底无语了
A题 ,多找几个规律看看就知道了,发现,从第k个数到第n个数是个循环,如果循环你的数不样的话就不可能存在,如果循环里的数一样的话,就看从k'向前扫描看第几个数和k不一样那么必须把这个数和这个数一样的的数全部都T掉,所以答案就输出这个数的位置
B题 ,用个代表行 和 列的指针 就行了,每次行或者列交换,只是指针的值 之间的交换
C题,郁闷,我怎么都看不懂c题意,英语太他妈的狗屎了
D题,贪心,先把a数组从小都打排序,把b数组加入集合,从左到右扫面a,然后查找 >= x-a[i] 最小的数,ans++,用multiset实现很方便
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
const int maxn=100010;
int a[maxn];
multiset<int> st;
multiset<int>::iterator it;
int main()
{
int n,m,tmp;
while(scanf("%d%d",&n,&m)==2)
{
st.clear();
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
scanf("%d",&tmp);
st.insert(tmp);
}
int ans=0;
for(int i=0;i<n;i++)
{
it=st.lower_bound(m-a[i]);
if(it!=st.end()) ans++,st.erase(it);
}
printf("1 %d\n",ans);
}
return 0;
}
E题 就是赤裸裸的矩阵快速幂,用举证来表明状态和状态之间的转移
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <cstring>
using namespace std;
const int mod=1000000007;
typedef long long ll;
ll a[52][52],b[52][52],sz;
int cal(char c)
{
if(c>='a'&&c<='z') return c-'a';
else return c-'A'+26;
}
void mult(ll a[][52],ll b[][52])
{
ll tmp[52][52]={0};
for(int i=0;i<sz;i++)
for(int j=0;j<sz;j++)
for(int r=0;r<sz;r++)
tmp[i][j]=(tmp[i][j]+a[i][r]*b[r][j])%mod;
memcpy(a,tmp,sizeof(tmp));
}
int main()
{
ll n;
int k;
char l[3];
while(scanf("%I64d %d %d",&n,&sz,&k)==3)
{
for(int i=0;i<sz;i++)
for(int j=0;j<sz;j++) a[i][j]=1,b[i][j]=(i==j);
for(int i=0;i<k;i++)
{
scanf("%s",l);
int t1=cal(l[0]),t2=cal(l[1]);
a[t1][t2]=0;
}
for(n--;n;n>>=1,mult(a,a))
if(n&1) mult(b,a);
ll ans=0;
for(int i=0;i<sz;i++)
for(int j=0;j<sz;j++)
ans=(ans+b[i][j])%mod;
printf("%I64d\n",ans);
}
return 0;
}