2024ICPC成都题解

题目链接

L. Recover Statistics(签到)

J. Grand Prix of Ballance(模拟签到)

在这里插入图片描述

struct Node{
   
   
    int val,id;
    bool operator<(const Node&tmp)const{
   
   
        if(val!=tmp.val)return val>tmp.val;
        return id<tmp.id;
    }
};
void solve(){
   
   
    int n,m,q;
    cin>>n>>m>>q;
    vector<int> cnt(n+1,m),ans(m+1);
    map<int,bool> mp[n+1];
    int now=0;
    while(q--){
   
   
        int op,x,y;
        cin>>op>>x;
        if(op==1){
   
   
            now=x;
            continue;
        }
        cin>>y;
        if(now!=y)continue;
        if(mp[y].count(x))continue;
        if(op==2)ans[x]+=cnt[y]--;
        mp[y][x]=1;
    }
    vector<Node> node;
    for(int i=1;i<=m;i++)node.push_back({
   
   ans[i],i});
    sort(node.begin(),node.end());
    for(auto [x,y]:node)cout<<y<<" "<<x<<"\n";
}

A. Arrow a Row(构造)

在这里插入图片描述

int main()
{
   
   
	int t;cin>>t;
	while(t--){
   
   
		vector< pair<int,int> >ans;
		string s;
		cin>>s;
		int n=s.length();
		int f=0;
		for(f=n-1;s[f]=='>'&&f>=0;f--);
		if(s[0]=='-'||n-f<4||f<0){
   
   
			puts("No");
			continue;
		}
		for(int i=n-1;i>=f+3;i--) ans.push_back(make_pair(1,i+1));
		for(int i=1;i<=f;i++){
   
   
			if(s[i]=='>') ans.push_back(make_pair(i+1,f+4-i));
		}
		printf("Yes %d\n",ans.size());
		for(int i=0;i<ans.size();i++) printf("%d %d\n",ans[i].first,ans[i].second);
	}
	return 0;
}

B. Athlete Welcome Ceremony(线性dp)

在这里插入图片描述

  • 很经典的线性dp,定义 f i , j , k , 0 / 1 / 2 f_{i,j,k,0/1/2} fi,j,k,0/1/2表示考虑前 i i i位,问号中有 j j j a a a, k k k b b b,当前选 a / b / c a/b/c a/b/c的方案数
  • 然后询问的话做一个三维前缀和
  • 复杂度 O ( n 3 + q ) O(n^3+q) O(n3+q)
  • 复盘:以后写滚动数组再也不另开空间了,在这题直接tle了
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define LL long long
#define F first
#define S second
#define TR tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>
// typedef pair<int,int> PII;
const int N=1e6+10,M=3e4+10;
// const int INF=1e18;
// const int mod=998244353;
const int mod=1e9+7;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
void add(LL &x,LL y){
   
   
    x+=y;
    if(x>=mod)x-=mod;
}
void sub(LL &x,LL y){
   
   
    x-=y;
    if(x<0)x+=mod;
}
void solve(){
   
   
    int n,q;
    cin>>n>>q;
    string s;
    cin>>s;
    s=" "+s;
    vector dp(2,vector (n+1,vector (n+1,vector<LL>(3))));
    int cnt=0;
    if(s[1]!='?'){
   
   
        if(s[1]=='a')dp[1][0][0][0]=1;
        if(s[1]=='b')dp[1][0][0][1]=1;
        if(s[1]=='c')dp[1][0][0][2]=1;
    }
    else{
   
   
        cnt++;
        dp[1][1][0][0]=1;
        dp[1][0][1][1]=1;
        dp[1][0][0][2]=1;
    }
    for(int i=2;i<=n;i++){
   
   
        if(s[i]=='?')cnt++;
        for(int j=0;j<=cnt;j++){
   
   
            for(int k=0;k+j<=cnt;k++){
   
   
                for(int x=0;x<3;x++)dp[i&1][j][k][x]=0;
            }
        }
        for(int j=0;j<=cnt;j++){
   
   
            for(int k=0;k+j<=cnt;k++){
   
   
                for(int x=0;x<3;x++){
   
   
                    if(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值