徐州总结 ----Features Track ---pair+map-----【很多注意事项】两颗线段树 node(int a,int b): a(a) ,b(b) {}

 


(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无可厚非啊对不对嘎嘎嘎)

【很多东西不熟在家不正是疯狂扒拉阿里的好机会吗。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值