2333这个是可以任意修改的而不是只能修改一个或两个构建一个新数组是二者的差值abs然后让k1k2去抹平这个差值考虑使用优先队列不断去砍此时差值的最大值或许应该是把最大的差值砍成第二大的差值而不是一次性全用完重复这个循环直到k1k2为0或者最大值是0AI题解智乃的36倍数预处理疑问就是两个数之间得满足某个关系等式然后现在是确定或者说枚举其中的一个数然后想知道满足此时半固定等式的第二个数的数量有多少当aj固定时10^k确定aj%36确定进一步考虑模乘法性质就是10^k%36在0-35之间aj%36也确定在查询时是按这俩数查吗但是在预处理时是知道的ai或者说是不把自己当成aj来处理的当知道aj时就是知道了等式右侧的值然后在预处理时自己作为ai去枚举k代入自己就能知道左式的值由此让对应的格子上的cnt说到底还是那个等式的应用即need等式左侧等式右侧在预处理的时候是枚举k利用自己用等式左侧在计数然后在枚举求答案的时候是直接利用自己和等式右侧去查预处理数组之前忽略了等式两侧本身算出来的值即预处理数组的第一维是在预处理时给ai算等式左侧用的第二维就是等式结果1541AI思路一样是统计未匹配的左括号数量区别在于遇到右括号时逻辑很清晰就是首先要保证这个右括号最终是连续的因为最终平衡时任意的右括号一定是连在一起的所以遇到右括号时先检查后面是不是右括号如果是那就跳过下一个对下一个不处理如果不是那就必须在这里直接插入来配平就直接ans后面再考虑对左括号的匹配问题如果前面有左括号那就--否则说明必须也要再加入左括号即ans最终考虑没完全匹配的左括号的数量交换后最大子数组和NC265666考虑最长的连续正数多项式输出对于这个题该如何分类才能清晰透彻不乱#include iostream #include cstdlib using namespace std; int main() { int n; cin n; bool first true; for (int i n; i 0; --i) { int a; cin a; if (a 0) continue; // 1. 输出符号 if (first) { if (a 0) cout -; } else { cout (a 0 ? : -); } int v abs(a); // 2. 输出数字系数、x、指数 if (i 0) { // 常数项 cout v; } else { // 非常数项|a| 1 时省略数字 1 if (v ! 1) cout v; cout x; if (i 2) { cout ^ i; } } first false; } return 0; }