首页 > 其他分享 >CSP20230917-3 梯度求解 题解

CSP20230917-3 梯度求解 题解

时间:2023-10-24 10:11:36浏览次数:32  
标签:tmp cnt int 题解 ll st CSP20230917 梯度 define

〇、题目

太长了懒得写。

简单来说就是求对于一个后缀表达式,每个询问给出一个下标和一些值,求以该下标变量为自变量其它变量为常数时的偏导数。

一、思路

考虑直接对于表达式建出表达式树。

建树的过程比较直接:每次栈里面放节点编号,遇到符号就取出当前栈顶两个节点作为子节点。

每次查询直接对整棵树爆搜,因为叶子节点一定是一个变量或一个常数,所以可以直接计算导数和原答案。

之后按照题目给出的公式直接代入即可。

二、代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
#define fi first
#define se second
#define endl '\n'
#define mp make_pair
#define pb push_back
#define all(x) x.begin(),x.end()
#define Cl(x) memset(x,0,sizeof(x))
const bool DC=0;
const ll mod=1e9+7;
const int N=0;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll qpow(ll a,ll b,ll p=mod){ll ans=1;for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;return ans;}
void NO(){cout<<"NO\n";}
void YES(){cout<<"YES\n";}
mt19937 rnd((unsigned long long)new char);

int n,m;
string s;int l;
string gt(){// 获取当前第一个单位字符串
	string ans;
	while(l<s.size()&&s[l]!=' ')ans+=s[l],l++;
	l++;
	return ans;
}
string ths[135];
stack<int>st;
int ls[135],rs[135],cnt;
int val[135],cur;
pii calc(int now){// 计算 now 的子树
	string s=ths[now];
	if(s[0]=='x'){// 变量
		int v=0;
		for(int i=1;i<s.size();i++)v=v*10+s[i]-48;
		return{(val[v]%mod+mod)%mod,v==cur};
	}
	if(s=="+"){// 符号
		pii l=calc(ls[now]),r=calc(rs[now]);
		return {(l.fi+r.fi)%mod,(l.se+r.se)%mod};
	}
	if(s=="-"){
		pii l=calc(ls[now]),r=calc(rs[now]);
		return {(l.fi+mod-r.fi)%mod,(l.se+mod-r.se)%mod};
	}
	if(s=="*"){
		pii l=calc(ls[now]),r=calc(rs[now]);
		return {1ll*l.fi*r.fi%mod,(1ll*l.se*r.fi%mod+1ll*r.se*l.fi%mod)%mod};
	}
	ll v=0;// 数
	int stt=(s[0]=='+'||s[0]=='-');
	bool f=(s[0]=='-');
	for(int i=stt;i<s.size();i++)v=v*10+s[i]-48;
	v%=mod;
	if(f)v=mod-v;
	return{v,0};
}
void __INIT__(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}
void __SOLVE__(int _case){
	cin>>n>>m;getchar();
	getline(cin,s);
	string tmp;while((tmp=gt())!=""){
		++cnt;
		if(tmp=="+"||tmp=="-"||tmp=="*"){
			int a,b;
			b=st.top();
			st.pop();
			a=st.top();
			st.pop();
			ls[cnt]=a,rs[cnt]=b;// 拿出左右儿子
		}
		ths[cnt]=tmp;
		st.push(cnt);
	}
	while(m--){
		cin>>cur;
		for(int i=1;i<=n;i++)cin>>val[i];
		cout<<calc(cnt).se<<endl;
	}
}
int main(){/*freopen(".in","r",stdin);freopen(".out","w",stdout);__INIT__();*/int T;DC?cin>>T,1:T=1;for(int _CASE=1;_CASE<=T;_CASE++)__SOLVE__(_CASE);return 0;}

三、总结

正解不够恶心人。

标签:tmp,cnt,int,题解,ll,st,CSP20230917,梯度,define
From: https://www.cnblogs.com/tigerchen/p/17784100.html

相关文章

  • Codeforces Round 886 (Div. 4) 题解
    link我为什么还要vpdiv4场。。。A直接找最大的两个判断一下。voidsolve(){ inta[3]; cin>>a[0]>>a[1]>>a[2]; sort(a,a+3); if(a[2]+a[1]>=10)cout<<"YES\n"; elsecout<<"NO\n";}B按照题目意思模拟。voidsolv......
  • P3657 题解
    是不是有点恶意评分了题目链接Sol看完题目就想到了这个题。这道题同样是求线段,不过这个加了点限制,发现一个点最多连4条边出去,暴力连边的复杂度是正确的,于是就把这题变成黄了。利用刚刚那道题的trick,把边按左端点排序后右端点的LIS就是答案。这里给一个更方便的做法,不用......
  • P2679 [NOIP2015 提高组] 子串 题解
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintMOD=1000000007;intn,m,k,dp[205][205][2];charA[1005],B[205];signedmain(){cin.tie(0)->sync_with_stdio(0);cin>>n>>m>>k;cin......
  • P9754 [CSP-S 2023] 结构体 题解
    考前内心OS:“CCF不会出大模拟吧(((”。前置声明辅助函数:偏移量考虑一个结构体的偏移量。已知首个空地址\(\mathrm{address}\)和该结构体的对齐要求\(\mathrm{align}\),则该结构体正确的起始地址为\(\mathrm{\lceiladdress/align\rceil\timesalign}\)。i64shiftToAl......
  • CF1710 题解
    CF1710题解A看图写话。想象一个格子以及周围同色格的颜色必须呈一个三叉的形状:################这些三叉拼起来最小的形状,就是两个以上的整行,或整列。所以遍历每一种颜色,通过整......
  • CSP-S 2023 游记 & 总结 & 题解
    游记到了机房发现是Windows10,感觉不错。比赛开始果断启动虚拟机,怎么今年PDF密码这么复杂啊,我记得去年挺简单的来着,好像是believe2022?看了一遍题,有理由怀疑T1是J的题,但是一开始读错了,以为只能转一下,后来计算转动幅度的时候忘记对\(10\)取模,怒调1h。T2一开始以为是容......
  • 【题解】CF1710 合集
    CF1710AColorthePicture标签:思维题\(C^-\)典型的有图有真相,嘻嘻(抽风了?显然有一个结论,我们颜色要么一行一行天,要么一列一列填。并且填进去的颜色必须不少于两行/列然后就是记一个ans和一个over表示如果每个颜色都两行/列填进去能填的最多列数,以及两行/列填进去后还能......
  • Educational Codeforces Round 144(CF1796 D~E) 题解
    D.MaximumSubarray题目链接十分钟秒了一道*2000,非常爽,但是个人感觉确实非常简单。下面令\(b_i=a_{i}-x\),\(b_i'=a_i+x\)。因为\(k<=20\),因此考虑一个复杂度与\(k\)相关的做法。不妨dp:设\(f_{i,j,0/1}\)表示考虑了前\(i\)个数,对\(j\)个数加上了\(x\),第\(i\)......
  • CF1893E题解
    分析第一眼:博弈论。第二眼:呃……贪心?实际:DP。首先想这个游戏大抵存在必胜策略,否则不会让我们求。思考先手必胜条件,就是如何让这个数组最后只剩下一个数。设数列之和为\(sum\)。发现每次操作给两个数减的数字是一样的。那么对于每次操作,\(\Deltasum\)都为两者之间更少的......
  • CSP-S 2023 种树-题解
    CSP-S2023种树-题解闲话Mark.Down看错题面了,我一直以为树是倒着长的。题目描述给定一棵树,每天可以选择一个与已种树的地块相连的地块种树,每棵树每天会长\(max(1,c_i\timesx+b_i)\)米(\(x\)代表从任务开始第一天的天数),问最少多少天可以使\(\foralli\inn,Height_i\gea_i\)......