首页 > 其他分享 >A+B problem 题解

A+B problem 题解

时间:2024-01-31 23:45:02浏览次数:29  
标签:return 题解 texttt second printf problem fl first

先把一个单项式理解为:

符号,系数的绝对值,字母,指数。

为了方便操作,一口气读完整个字符串(数组),然后去扫描。

因为如果第一项为整数的话没有符号,判一判。

读入系数的绝对值像快读。

如果有 \(\texttt{^}\) 这个符号,读一下之后的指数。

由于只有三个字母,所以可以复制粘贴,不用写冗余的 \(\texttt{for}\) 循环。代码如下:

inline void change(polygon &a,char *s1){
	int l1=strlen(s1+1);
	for(int i=1;i<=l1;){
		int fl=1,x=0;
		d w1=nw,w2=nw,w3=nw;
		if(s1[i]=='+'||s1[i]=='-') fl=(s1[i]=='+'?1:-1),++i;
		while(isdigit(s1[i])) x=x*10+(s1[i]-'0'),++i;
		if(s1[i]=='x') w1.alpha=s1[i],++i;
		if(s1[i]=='^') ++i;
		while(isdigit(s1[i])) w1.digit=w1.digit*10+(s1[i]-'0'),++i; 
		w1.digit=!w1.digit?w1.alpha=='x':w1.digit;
		if(s1[i]=='y') w2.alpha=s1[i],++i;
		if(s1[i]=='^') ++i;
		while(isdigit(s1[i])) w2.digit=w2.digit*10+(s1[i]-'0'),++i; 
		w2.digit=!w2.digit?w2.alpha=='y':w2.digit;
		if(s1[i]=='z') w3.alpha=s1[i],++i;
		if(s1[i]=='^') ++i;
		while(isdigit(s1[i])) w3.digit=w3.digit*10+(s1[i]-'0'),++i; 
		w3.digit=!w3.digit?w3.alpha=='z':w3.digit;
		if(w1.alpha=='x'||w2.alpha=='y'||w3.alpha=='z') 
			a.x[{w1.digit,w2.digit,w3.digit}]+=fl*x;
		else a.q+=fl*x;
	}
}

然后考虑存储,约定一个结构体 \(str\) ,存储三个 \(\texttt{int}\) 变量 \(x,y,z\) 的质数。然后放进 \(\texttt{map}\) 里。映射项的系数。记得按照约定重载小于运算符。

定义一个多项式结构体,由一个 \(\texttt{map}\) 以及一个存储多项式常数的整型组成。

struct str{ 
	int x,y,z; 
	bool operator < (const str b) const{
		if(x+y+z!=b.x+b.y+b.z) return x+y+z>b.x+b.y+b.z;
		if(x!=b.x) return x>b.x;
		if(y!=b.y) return y>b.y;
		return z>b.z;
	}
};
struct polygon{	map<str,int> x; int q; }a,b,c;

表示 \(A,B,A+B.\)

合并同类项就扫一遍两个 \(\texttt{map}\) ,然后让新的 \(A+B\) 的每一项系数加上原来的系数。

inline void add(void){
	for(auto it:a.x) c.x[{it.first.x,it.first.y,it.first.z}]+=it.second;
	for(auto it:b.x) c.x[{it.first.x,it.first.y,it.first.z}]+=it.second;
	c.q=a.q+b.q;
}

然后按要求输出,这一步多加小心。\(\texttt{cbh}\) 可是很毒瘤的。

inline void output(polygon x){
	bool fl=0;
	for(auto it:x.x){
		if(!it.second) continue;
		if(it.second>0&&fl) printf("+");
		if(it.second==-1) printf("-");
		if(it.second!=1&&it.second!=-1) printf("%d",it.second);
		if(it.first.x==1) printf("x");
		if(it.first.x>1) printf("x^%d",it.first.x); 
		if(it.first.y==1) printf("y");
		if(it.first.y>1) printf("y^%d",it.first.y); 
		if(it.first.z==1) printf("z");
		if(it.first.z>1) printf("z^%d",it.first.z); 
		fl=1;
	}
	if(x.q){
		if(x.q>0&&fl) printf("+");
		printf("%d",x.q);
		fl=1;
	}
	if(!fl) printf("0");
	return puts(""),void();
}

标签:return,题解,texttt,second,printf,problem,fl,first
From: https://www.cnblogs.com/QxBlogs/p/18000360/AplusBproblem

相关文章

  • CEIT算法训练-双指针部分题解(T1-3)
    AnagramSearch题意简述两个字符串\(s\)和\(t\)相似的定义为:\(s\)可以打乱之后重新排列成为\(t\)。题目给出\(a\)和\(b\),问\(a\)中有多少子串(连续的一段)与\(b\)相似。同时,\(a\)中还含有\(?\)字符,他可以等价于任何字符(可以变成任何字符)解题思路实际上,根据题......
  • 题解 P6491 [COCI2010-2011#6] ABECEDA
    传送门。分析两个字符大小关系不变,并且具有传递性,我们可以联想到拓扑排序来解决。因此,我们就通过字符串的大小关系,推断出一些字符的大小关系,然后拓扑排序即可。#include<bits/stdc++.h>#include<vector>#include<string>#include<queue>//#defineintlonglongusing......
  • [ARC154E] Reverse and Inversion 题解
    题目链接点击打开链接题目解法\(\sumj-i\)是不好维护的,考虑把\(j-i\)拆成之和\(i,j\)相关的项可以得到:\(\sum\limits_{i<j}[p_i>p_j](j-i)=\sum\limits_{i=1}^ni(\sum\limits_{j=1}^{i-1}[p_j>p_i]-\sum\limits_{j=i+1}^n[p_j<p_i])=\sum\limits_{i=1}^ni(i-1-\sum\......
  • [AGC024E] Sequence Growing Hard 题解
    题目链接点击打开链接题目解法考虑如何添加数,使得\(\{a_1,...,a_i\}\)到\(\{a_1,...,x,a_j,...,a_i\}\)是合法的需要手玩一会才能发现合法条件很简单:\(x>a_j\)考虑对这个进行计数一个一个添元素是难维护的,现在假设有最终的序列,每个位置有\((v,dfn)\),分别为值和添加的次......
  • OGG-00303 Problem at line 37. Expecting file, table, or record definition: TimeZ
    由于源端和目标端表结构不一致(列顺序有差异),因此使用def文件来同步。在源端配置好def文件后,启动复制进程报错,具体信息如下:2024-01-3111:24:16ERROROGG-00303OracleGoldenGateDeliveryforOracle,r_bszj.rp:Problematline37.Expectingfile,table,orrecorddefin......
  • CF813E Army Creation 题解
    题目链接:CF或者洛谷并不是很难的题,关于颜色数量类问题,那么很显然,沿用经典的"HH的项链"思想去思考问题。由于涉及到了\(k\)个数的限制,我们观察到如果一个数在一个区间上有区间贡献:其中\(x_k\)表示为当前\(x\)的第前\(k+1\)个数,换句话来讲,\(x_k\)到当前的\(x\)所......
  • The XOR-longest Path 题解
    我们观察题干知道此题为单调递增(节点),这样我们就不用跑dfs了很显然的一件事是两点间的权值只与子节点有关所以我们用w1[v]=w1[u]*w就能更新v到根节点的权值然后我们循环放入字典树,再取最大的(由于这题数据特别水,所以没算v-u的w1)#include<bits/stdc++.h>usingnamespacestd;in......
  • 题解 P7309 [COCI2018-2019#2] Kocka
    传送门。题意一个$N\timesN$的矩形,有从四周往内望去的第一个位置的距离,问是否存在一个矩形满足我们的观察。分析先说说我这个蒟蒻想出来的巨麻烦的方法。首先先判断最简单的矛盾,就是左右穿插,上下穿插,这是第一步。//-1变成nfor(inti=1;i<=n;++i)if(L[i]+R[i]>=n)......
  • 题解 P6548 [COCI2010-2011#2] IGRA
    传送门。题意有\(A\),\(B\)两个人,有一个含\(n\)个字符的字符串。\(A\)始终取最右侧的字符,\(B\)可以取任意一个字符,问\(B\)所取的字符串能否胜过\(A\),以及\(B\)能取的最大字符串。分析首先,我们\(A\)肯定会选择当前的最小的字符,我们就可以先把字符按大小排序,字符相......
  • 【题解】CF185D - Visit of the Great
    【题解】CF185D-VisitoftheGreat设\(d=\gcd(k^{2^a}+1,k^{2^b}+1),(a<b)\),则:\[k^{2^a}\equivk^{2^b}\equiv-1(\bmodd)\]所以\[1\equiv(-1)^{2^{b-a}}\equivk^{2^a*2^{b-a}}\equivk^{2^b}\equiv1(\bmodd)\]所以\(d\)为\(1\)或\(2\)。设\(t......