#include<bits/stdc++.h>
#define int long long
#define SPACE putchar(' ');
#define ENDL putchar('\n');
const int N =1e5+10;
using namespace std;
int read(){
int x=0,f=1;
char c=getchar();
while(c>'9' || c<'0'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0' && c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void write(int x){
if(x<0){
putchar('-');
x*=-1;
}
if(x>9)write(x/10);
putchar(x%10+'0');
}
struct line{
int k;//斜率
int b;//位移
int cnt;//直线个数
}a[N];
int n, t;
void print();
signed main(){
n=read();
for(int i=1;i<=n;i++){
int choose, ki, bi;
int ans=0;
//输入
choose=read();
ki=read(),bi=read();
//第一种
if(choose == 1){
bool deposit_ = false;
//存入数组
for(int i=1;i<=t;i++){
if(a[i].k == ki && a[i].b == bi){//如果有一摸一样的直线就直接存
a[i].cnt++;
deposit_=true;
break;
}
}
if(!deposit_){//存储
t++;
a[t].k=ki;
a[t].b=bi;
a[t].cnt=1;
}
// print();
}
//第二种
if(choose==2){
//查询数量
for(int i=1;i<=t;i++){
if(a[i].k != ki){//斜率不相等 -> 相交
ans += a[i].cnt;
}
}
// print();
write(ans);//输出ans
ENDL;
}
//第三种
if(choose == 3){
//擦除
for(int i=1;i<=t;i++){
if(a[i].k != ki || (a[i].k == ki && a[i].b == bi)){//相交 或 重合
//移除
swap(a[i],a[t]);
t--;
}
}
// print();
}
}
return 0;
}
/*
10
1 1 0
1 1 0
2 1 1
2 1 0
2 2 5
3 1 0
2 2 5
1 2 3
1 3 4
2 3 5
-----------
0
0
2
0
1
*/
void print(){
ENDL;
for(int i=1;i<=t;i++){
printf("y=%lldx+%lld %lld",a[i].k,a[i].b,a[i].cnt);
ENDL;
}
ENDL;
}
还有一个问题,结构体存储可以怎样减少时间复杂度?感谢可以帮忙调试的大佬Orz