#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<queue>
#include <math.h>
using namespace std;
#define mod 998244353
const int N=1005;
long long a[N][N];
long long f[N][N];
signed main()
{
// cout<<mod<<endl;
int n,m,p,q;
cin>>n>>m>>p>>q;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
cin>>a[i][j];
}
if(!a[1][1])
f[1][1]=1;
else f[1][0]=1;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
if(i!=1||j!=1)
{
if(a[i][j])
for(int k=i+j-1; k>=0; k--)
f[j][k]=(f[j-1][k]+f[j][k])%mod;//dp的转移方程
else
{
for(int k=i+j-1; k; k--)
f[j][k]=(f[j-1][k-1]+f[j][k-1])%mod;
f[j][0]=0;
}
}
}
int ans=0;
for(int i=p; i<=n+m-q-1; i++)
{
ans+=f[m][i];
ans%=mod;
}
cout<<ans<<endl;
}
不要想的太复杂
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 101;
int t;
int x,y;
int a[maxn];
int main()
{
cin>>t;
while (t--)
{
cin>>x>>y;
int idx = 0;
while (y!=1)
{
int p = x / y;
a[idx++] = p;
x -= p * y;
swap(x,y);
}
a[idx++] = x;
cout<<idx-1<<" ";
for (int i=0;i<idx;++i)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
博弈论(真烦!!!)注意特殊情况,只要第一次先手没有把后手弄shi就输了,因为后手可以一直奶自己然后耗先手。下次可以列出普遍情况先手后手的血量状态来计算试试
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
int n,k;
while(t--)
{
cin>>n>>k;
if(n==1) cout<<"freesin"<<endl;
else if(k+1>=n) cout<<"pllj"<<endl;
else cout<<"freesin"<<endl;
}
// system("pause");
return 0;
}
题目都没看懂但是队友出了?
#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int N = 1e5 + 10;
int a[N];
struct node {
int idx, val;
bool operator<(const node& a) const { return idx < a.idx; }
};
int check(int x, int n, int k){
set<node> se;
map<int, int> mp;
int cnt = 0;
for (int i = 1; i <= n; ++i) {
if (mp.count(a[i])) {
++cnt;
se.erase({mp[a[i]], a[i]});
se.insert({i, a[i]});
mp[a[i]] = i;
continue;
}
if (se.size() == x) {
node top = *se.begin();
se.erase(se.begin());
mp.erase(top.val);
}
mp[a[i]] = i;
se.emplace(node{i, a[i]});
}
return cnt>=k;
}
int main(){
int n, k; cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> a[i];
int l = 1, r = n, ans = -1;
while(l <r){
int mid = l + r >> 1;
if(check(mid, n, k)) r = mid, ans = mid;
else l = mid + 1;
}
if(ans < 0) cout<<"cbddl"<<endl;
else cout<<ans<<endl;
// system("pause");
return 0;
}
水报告
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
int n,m;
int sum=0;
while(t--)
{
cin>>n>>m;
sum=0;
for(int i=1;i<=n;i++)
{
sum+=i*i;
}
cout<<sum*m<<endl;
}
// system("pause");
return 0;
}
呃。。。区间写的,好像用不到,差分前缀和好像好一点,因为我临界搞了好长时间
//临场发挥
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
typedef pair<int, int> PII;
PII q[N];
int n;
int cnt;
int main(){
cin >> n;
int a, b, c, d;
for(int i = 0; i < n; i ++){
cin >> a >> b >> c >> d;
q[i].first = a;
q[i].second = c;
}
sort(q, q + n);
int st = q[0].first, ed = q[0].second;
for(int i = 1; i < n; i ++){
if(q[i].second >= ed && q[i].first <= ed) {
ed = q[i].second;
}
if(q[i].first > ed){
cnt += ed - st;
st = q[i].first;
ed = q[i].second;
}
}
cnt += ed - st;//不要忘记会变得不幸
cout << cnt << endl;
return 0;
}