(1)二维数组vector
vector<vector<int> >d;
d.resize(maxn);
但是注意,它既然作为一个vector,它查找不方便。要从前往后啊巴拉巴拉。。。反正,不太能找这种“有没有出现过”的,这也是vector的弱点啊,因为是不定长的数组。用一下还行点
for(int i=1;i<=v.size();i++) g[i][1]
用没啥问题,但是不能按照下标指定(不能指定1,1看是否为1来判断是否出现过)
饿。所以我们直接写vector<int> g[maxn]用起来就一样了。他只是存储工具
(2)前导0... 当做经验记下来吧。。 被坑了
看题里来,题里说是2位就是2位。如果是00 ,应该cout1,因为0是1位。表现形式是0,但是长度是1
【前导0问题。最后遇到0是1位,要输出的是1 而不是0】
(3)继续复习pair对问题
这个laj题如果是set写,set、map内部都是红黑树,需要有偏序关系,要重载小鱼号。
尤其只能写小鱼。。 等鱼不能写。。。
所以你才不能用的。插入的话就这样插(使用构造函数1!)
【另外map要满足xx偏序关系,要重载小鱼号的,既然是插入那就要写构造函数】(如果用struct的话!!!)
注意一下写法,我就是不会写。。。 node a (1,3)
构造函数不会写了。。
node (int a,int b ) : a(a) b(b) {}这样才合法,不然会报错的!
//并且,这个不用手工sort,所以不写在外面,只能写在里面,运算符重载要这种形式
bool operator<(const node &p)const {
return a < p.a;
}
再继续注意【下标访问。】
int rec = tmp; m[on].insert(tmp, rec++);这 是不行的
而是:int rec = m[on][tmp];
想到之前不是说嘛,就只是把上面改掉,下面数组换都不用换。。唔,后面也是 int rec = m[on][tmp]; m[on][tmp]++;
这里开个二维的,其实开两个也完全可以胜任。=。-开个二维是滚动数组,还好吧,更快,学习一下
好了,写法学会了,我觉得这个思想有问题,怎么更迭?遇到一些陈年不用的呢?我自己改一下吧
最后完整代码。
。。。。。我不知道说啥。我没有翻c++ reference的习惯,我看了那里的注释亦不知道该怎么改。
。。。。。。。。。所以可能还是pair方便?
(1)
使用下标访问的话,访问过一次默认是插入过了。
(2)
不然的话。。。按你写的,要默认访问前1个为止啊
没有那句话,上图结果为1,有的话为0(比了1停下/比了1继续往后)
可是为甚还是错呢?我怀疑我被吓了药。。。
但可能差距就在于此。_(:з」∠)_自己找到为什么wa。这个很重要,但“写不出来,样例buguo”把她掩盖了
#include<algorithm>
#include<iostream>
#include<map>
#include<string>
using namespace std;
const int maxn = 10005;
struct node {
int a;
int b;
node(int a, int b) :a(a), b(b) {}
bool operator<(const node &p)const {
if (a == p.a)return b<p.b;
else return a < p.a;
//return a < p.a;
}
};
map<node, int> m;
map<node, int> d;
int main() {
int t; cin >> t; while (t--) {
int n; cin >> n;
m.clear(); d.clear();
int s, a, b; int ans = 0;
//针对第一个
cin >> s;
for (int j = 1; j <= s; j++) {
cin >> a >> b;
node tmp(a, b);
d[tmp] = 1;
m[tmp] = 1;
//cout<<a<<" "<<b<<endl;
// cout << m[tmp] << "(0为没出现,1为出现了)" << endl;
ans = max(m[tmp], ans);
}
for (int i = 2; i <= n; i++) {
cin >> s;
for (int j = 1; j <= s; j++) {
cin >> a >> b;
node tmp(a, b);
// cout<<a<<" "<<b<<endl;
// cout << m.count(tmp) << "(0为没出现,1为出现了)" << endl;
// cout << m[tmp] << "(0为没出现,1为出现了)" << endl;
// cout << m.count(tmp) << "(0为没出现,1为出现了)" << endl;
// cout << m[tmp] << "(0为没出现,1为出现了)" << endl;
if (d[tmp] == i - 1)m[tmp]++;
else m[tmp] = 1;
ans = max(m[tmp], ans);
d[tmp] = i;
//cout << m[tmp] << "(0为没出现,1为出现了)" << endl;
}
//我就是因为这样才一题都过不了
//就是因为遇到问题就求 还对应一个有求必应的人
}cout << ans << endl;
}return 0;
}
如果是pair存的话:https://blog.csdn.net/qq_41021816/article/details/82562176
这个也很好。。我大概是借鉴了一下使用方法吧。-。-但是!这种的,太乱 了。
自己的方法A掉也还行。
注意:【关于WA点:】如上博客写+1而不是++
比如2 1 1 1 1 这种出现了两次,在我的代码里面会误判。(这是最后没有注意到的wa点)
此外,我的代码里面没出现应该是0而不是1,即:m[tmp]=1
此外,内层外层循环应该一个i一个j
此外,我怕i-1 i为1时0影响把1单独写了,这里其实应该也补上ans
这么久了终于自己(独立)(不)过了一题。。我先奖励自己一块钱到小钱袋_(:з」∠)_(因为太慢了。。)
map基本用法
3. 插入数据
(1) my_Map[1] = 1;
(3) my_Map.insert(pair<int,int>(3,3));
(4) my_Map.insert(make_pair<string,int>(4,4));
4 查找数据和修改数据
(1) int i = my_Map[1];
my_Map[1] = i;
(2) MY_MAP::iterator my_Itr;
my_Itr.find(2);
int j = my_Itr->second;
my_Itr->second = j;
注意:
A.键本身是不能被修改的,除非删除。
B.不管键存不存在,比如my_Map[1] = i;,都会执行赋值操作。
5 删除数据
(1) my_Map.erase(my_Itr);
(2) my_Map.erase(3);
6 遍历数据
for (my_Itr=my_Map.begin(); my_Itr!=my_Map.end(); ++my_Itr) {}
7 其它方法
my_Map.size() :返回元素数目
my_Map.empty():判断是否为空
my_Map.clear() :清空所有元素
待解决
vector
emmmm,长期看我博客的诸位,1题什么水平-。-
找了两个半小时,心态爆炸
相当于前后我都只是一个人在打,还很懒散,还很心态爆炸
大概是补题的时候只是学了知识点,都是在瞎补吧。。自己搞一堆,粘粘代码上去拼接一下,把解题过程写了一堆,但其中鲜有自己的思考。说出来还有点丢人啊。。 不过我也不知道自己真实实力在哪。。 打几场atcoder/cf什么的一下吧。……
“你必须承认天赋之间有差别,这无可争议,但是我们努力不是为了追上他们,是为了对的起自己,是为了看自己究竟能到达什么程度(。・ω・。)”(所以我用vs无可厚非啊对不对嘎嘎嘎)
【很多东西不熟在家不正是疯狂扒拉阿里的好机会吗。。。